package br.edu.ufam.avaliacao

class AvaliadorController {

    static allowedMethods = [save: "POST", update: "POST", delete: "POST"]

    def index = {
        redirect(action: "list", params: params)
    }
    
    def list = {
               
        def usuario_id = session.usuario
        List<Avaliacao> avaliacoes = new ArrayList<Avaliacao>()
        def pendente = Avaliacao.findAll("from Avaliacao a where a.status='Coordenador'")        
        
        for (Avaliacao avaliacao:pendente){            
            if (avaliacao.curso.coordenador.id == usuario_id)
                avaliacoes.add(avaliacao)
        }
                
        
        List<Avaliacao> avaliacaoAvaliadores = Avaliacao.findAll("from Avaliacao a where a.usuario.id=? and a.status=?",[usuario_id,"Em andamento"])
        
        if (avaliacoes)
            avaliacaoAvaliadores += avaliacoes
            
//        for (Avaliacao avaliacao : avaliacoes){
//            avaliacaoAvaliadores.add(avaliacao)
//        }
        
        params.max = Math.min(params.max ? params.int('max') : 10, 100)
        [avaliacaoInstanceList: avaliacaoAvaliadores, avaliacaoInstanceTotal: Avaliacao.count()]
    }
          
    def edit = {
              
        def indicadoresDimensao1 = Indicador.executeQuery(" select i from Indicador i where i.dimensao.ordem = ? order by i.ordem", [1]) 
        def indicadoresDimensao2 = Indicador.executeQuery(" select i from Indicador i where i.dimensao.ordem = ? order by i.ordem", [2]) 
        def indicadoresDimensao3 = Indicador.executeQuery(" select i from Indicador i where i.dimensao.ordem = ? order by i.ordem", [3]) 
        def indicadoresDimensao4 = Indicador.executeQuery(" select i from Indicador i where i.dimensao.ordem = ? order by i.ordem", [4]) 
        def avaliacaoInstance = Avaliacao.get(params.id)                                
        
        boolean coordenador = (session.usuario == avaliacaoInstance.curso.coordenador.id)
        
        int isCoordenador = (coordenador)? 1 : 0
                
        
        def respostaInstance = Resposta.executeQuery("select r from Resposta r where r.avaliacao=? and r.coordenador=? order by r.dimensao,r.indicador",[avaliacaoInstance,isCoordenador])                
        

        return [indicadoresDimensao1: indicadoresDimensao1,indicadoresDimensao2: indicadoresDimensao2,indicadoresDimensao3: indicadoresDimensao3,indicadoresDimensao4: indicadoresDimensao4, avaliacaoInstance: avaliacaoInstance, respostaInstance: respostaInstance,isCoordenador: isCoordenador]
    }

    def update = {
        def avaliacaoInstance = Avaliacao.get(params.id)
        def avaliacaoInstance1 = Avaliacao.get(params.id)
        def avaliacaoInstance2 = Avaliacao.get(params.id)
        def avaliacaoInstance3 = Avaliacao.get(params.id)
        def avaliacaoInstance4 = Avaliacao.get(params.id)
        
        boolean coordenador = (session.usuario == avaliacaoInstance.curso.coordenador.id)
        
        int isCoordenador = (coordenador)? 1 : 0
        
        long bla = 334
        long d2 = 397
        long d3 = 407
        long d4 = 458
        
        def countDimensao1 = Indicador.executeQuery("select count(*) from Indicador i where i.dimensao.id=?",bla)
        def countDimensao2 = Indicador.executeQuery("select count(*) from Indicador i where i.dimensao.id=?",[d2])
        def countDimensao3 = Indicador.executeQuery("select count(*) from Indicador i where i.dimensao.id=?",[d3])
        def countDimensao4 = Indicador.executeQuery("select count(*) from Indicador i where i.dimensao.id=?",[d4])
        
        int count1 = countDimensao1.get(0);
        int count2 = countDimensao2.get(0);
        int count3 = countDimensao3.get(0);
        int count4 = countDimensao4.get(0);
      
        def dimensao1 = 1
        def dimensao2 = 2
        def dimensao3 = 3
        def dimensao4 = 4
        
        //DIMENSAO 1
        for(int i=1;i<=count1;i++){
            String goku = String.valueOf(dimensao1) + "." + String.valueOf(i)            
            def resposta = Resposta.executeQuery("select r from Resposta r where r.avaliacao=? and r.dimensao=? and indicador=? and coordenador=?",[avaliacaoInstance1,dimensao1,i,isCoordenador])            
            if(!resposta){
                def respostaInstance = new Resposta()
                respostaInstance.avaliacao = avaliacaoInstance1                 
                respostaInstance.conceito = (params.get(goku)) ? Integer.valueOf(params.get(goku)) : -1
                    //println respostaInstance.conceito
                respostaInstance.dimensao = dimensao1
                respostaInstance.indicador = i
                respostaInstance.justificativaNSA = ""
                respostaInstance.respostaRequisitoNormativo = 0
                respostaInstance.lastUpdated = new Date()
                respostaInstance.coordenador = isCoordenador
                
        
                respostaInstance.save(flush: true)
            }else{
               int conceito = (params.get(goku)) ? Integer.valueOf(params.get(goku)) : -1
                Resposta.executeUpdate("update Resposta r  set r.conceito=?,r.lastUpdated=? where r.avaliacao=? and r.dimensao=? and indicador=? and coordenador=?",[conceito,new Date(),avaliacaoInstance1,dimensao1,i,isCoordenador])
            }
    
    
        }
        
        int pesoDimensao1 = avaliacaoInstance1.pesoDimensao1
        //println pesoDimensao1   
        def sumList = Resposta.executeQuery("select sum(r.conceito) from Resposta r where r.avaliacao=? and r.dimensao=? and r.conceito>? and r.coordenador=?",[avaliacaoInstance1,dimensao1,0,isCoordenador])
        int sum = sumList.get(0) 
        //println sum
        count1 = Resposta.executeQuery("select r from Resposta r where r.avaliacao=? and r.dimensao=? and r.conceito>? and r.coordenador=?",[avaliacaoInstance1,dimensao1,0,isCoordenador]).size()
        
        double mediaDimensao1 = (count1) ? sum.div(count1) : 0
        //println mediaDimensao1
    
        
        Avaliacao.executeUpdate("update Avaliacao a  set a.relatoDimensao1=?,a.lastUpdated=?,a.conceitoDimensao1=? where a.id=?",[params.relatoDimensao1,new Date(),mediaDimensao1.round(1),avaliacaoInstance1.id])
        if (isCoordenador == 1) 
        Avaliacao.executeUpdate("update Avaliacao a  set a.coordenadorRelatoDimensao1=?,a.lastUpdated=?,a.coordenadorConceitoDimensao1=? where a.id=?",[params.relatoDimensao1,new Date(),mediaDimensao1.round(1),avaliacaoInstance1.id])
        
        //DIMENSAO 2
        for(int i=1;i<=count2;i++){
            String goku = String.valueOf(dimensao2) + "." + String.valueOf(i)
            def resposta = Resposta.executeQuery("select r from Resposta r where r.avaliacao=? and r.dimensao=? and indicador=? and coordenador=?",[avaliacaoInstance2,dimensao2,i,isCoordenador])
            if(!resposta){
                def respostaInstance = new Resposta()
                respostaInstance.avaliacao = avaliacaoInstance2
                respostaInstance.conceito = (params.get(goku)) ? Integer.valueOf(params.get(goku)) : -1
                respostaInstance.dimensao = dimensao2
                respostaInstance.indicador = i
                respostaInstance.justificativaNSA = ""
                respostaInstance.respostaRequisitoNormativo = 0
                respostaInstance.lastUpdated = new Date()
                respostaInstance.coordenador = isCoordenador
                
        
                respostaInstance.save(flush: true)
            }else{
                int conceito = (params.get(goku)) ? Integer.valueOf(params.get(goku)) : -1
                Resposta.executeUpdate("update Resposta r  set r.conceito=?,r.lastUpdated=? where r.avaliacao=? and r.dimensao=? and indicador=? and coordenador=?",[conceito,new Date(),avaliacaoInstance2,dimensao2,i,isCoordenador])
            }
    
    
        }
        int pesoDimensao2 = avaliacaoInstance1.pesoDimensao2
        def sumList2 = Resposta.executeQuery("select sum(r.conceito) from Resposta r where r.avaliacao=? and r.dimensao=? and r.conceito>? and r.coordenador=?",[avaliacaoInstance1,dimensao2,0,isCoordenador])
        int sum2 = sumList2.get(0) 
        //println sum
        
        count2 = Resposta.executeQuery("select r from Resposta r where r.avaliacao=? and r.dimensao=? and r.conceito>? and r.coordenador=?",[avaliacaoInstance1,dimensao2,0,isCoordenador]).size()
        
        double mediaDimensao2 = (count2) ? sum2.div(count2) : 0
    
        
        Avaliacao.executeUpdate("update Avaliacao a  set a.relatoDimensao2=?,a.lastUpdated=?,a.conceitoDimensao2=? where a.id=?",[params.relatoDimensao2,new Date(),mediaDimensao2.round(1),avaliacaoInstance2.id])
        if (isCoordenador == 1)
        Avaliacao.executeUpdate("update Avaliacao a  set a.coordenadorRelatoDimensao2=?,a.lastUpdated=?,a.coordenadorConceitoDimensao2=? where a.id=?",[params.relatoDimensao2,new Date(),mediaDimensao2.round(1),avaliacaoInstance2.id])
        
        //DIMENSAO 3
        for(int i=1;i<=count3;i++){
            String goku = String.valueOf(dimensao3) + "." + String.valueOf(i)
            def resposta = Resposta.executeQuery("select r from Resposta r where r.avaliacao=? and r.dimensao=? and indicador=? and coordenador=?",[avaliacaoInstance3,dimensao3,i,isCoordenador])
            if(!resposta){
                def respostaInstance = new Resposta()
                respostaInstance.avaliacao = avaliacaoInstance3
                respostaInstance.conceito = (params.get(goku)) ? Integer.valueOf(params.get(goku)) : -1
                respostaInstance.dimensao = dimensao3
                respostaInstance.indicador = i
                respostaInstance.justificativaNSA = ""
                respostaInstance.respostaRequisitoNormativo = 0
                respostaInstance.lastUpdated = new Date()
                respostaInstance.coordenador = isCoordenador
        
                respostaInstance.save(flush: true)
            }else{
                int conceito = (params.get(goku)) ? Integer.valueOf(params.get(goku)) : -1
                Resposta.executeUpdate("update Resposta r  set r.conceito=?,r.lastUpdated=? where r.avaliacao=? and r.dimensao=? and indicador=? and coordenador=?",[conceito,new Date(),avaliacaoInstance3,dimensao3,i,isCoordenador])
            }
    
    
        }
        
        int pesoDimensao3 = avaliacaoInstance1.pesoDimensao3
        def sumList3 = Resposta.executeQuery("select sum(r.conceito) from Resposta r where r.avaliacao=? and r.dimensao=? and r.conceito>? and r.coordenador=?",[avaliacaoInstance1,dimensao3,0,isCoordenador])
        int sum3 = sumList3.get(0) 
        //println sum
        
        count3 = Resposta.executeQuery("select r from Resposta r where r.avaliacao=? and r.dimensao=? and r.conceito>? and r.coordenador=?",[avaliacaoInstance1,dimensao3,0,isCoordenador]).size()
        
        double mediaDimensao3 = (count3) ? sum3.div(count3) : 0

        
        Avaliacao.executeUpdate("update Avaliacao a  set a.relatoDimensao3=?,a.lastUpdated=?,a.conceitoDimensao3=? where a.id=?",[params.relatoDimensao3,new Date(),mediaDimensao3.round(1),avaliacaoInstance3.id])
        if (isCoordenador == 1)
        Avaliacao.executeUpdate("update Avaliacao a  set a.coordenadorRelatoDimensao3=?,a.lastUpdated=?,a.coordenadorConceitoDimensao3=? where a.id=?",[params.relatoDimensao3,new Date(),mediaDimensao3.round(1),avaliacaoInstance3.id])
        
        //DIMENSAO 4
        for(int i=1;i<=count4;i++){
            String goku = String.valueOf(dimensao4) + "." + String.valueOf(i)
            def resposta = Resposta.executeQuery("select r from Resposta r where r.avaliacao=? and r.dimensao=? and indicador=? and coordenador=?",[avaliacaoInstance4,dimensao4,i,isCoordenador])
            if(!resposta){
                def respostaInstance = new Resposta()
                respostaInstance.avaliacao = avaliacaoInstance4
                respostaInstance.conceito = 0//Integer.valueOf(params.get(goku))
                respostaInstance.dimensao = dimensao4
                respostaInstance.indicador = i
                respostaInstance.justificativaNSA = ""
                respostaInstance.respostaRequisitoNormativo = (params.get(goku)) ? Integer.valueOf(params.get(goku)) : -1
                respostaInstance.lastUpdated = new Date()
                respostaInstance.coordenador = isCoordenador
        
                respostaInstance.save(flush: true)
            }else{
                short conceito = (params.get(goku)) ? Integer.valueOf(params.get(goku)) : -1
                Resposta.executeUpdate("update Resposta r  set r.conceito=?,r.respostaRequisitoNormativo=?,r.lastUpdated=? where r.avaliacao=? and r.dimensao=? and indicador=? and coordenador=?",[0,conceito,new Date(),avaliacaoInstance4,dimensao4,i,isCoordenador])
            }
    
    
        }
        
   
        double mediaDimensoes = (mediaDimensao1*pesoDimensao1)+(mediaDimensao2*pesoDimensao2)+(mediaDimensao3*pesoDimensao3)
       
        long mediaFinal = (mediaDimensoes.div(100)).round()
        double mediaFinalDec = (mediaDimensoes.div(pesoDimensao1+pesoDimensao2+pesoDimensao3))
        
        
        Avaliacao.executeUpdate("update Avaliacao a  set a.relatoDimensao4=?,a.lastUpdated=?,a.conceitoFinal=?,a.conceitoFinalDec=? where a.id=?",[params.relatoDimensao4,new Date(),mediaFinal.toInteger(),mediaFinalDec.round(1),avaliacaoInstance4.id])
        if (isCoordenador == 1)
        Avaliacao.executeUpdate("update Avaliacao a  set a.coordenadorRelatoDimensao4=?,a.lastUpdated=?,a.coordenadorConceitoFinal=?,a.coordenadorConceitoFinalDec=? where a.id=?",[params.relatoDimensao4,new Date(),mediaFinal.toInteger(),mediaFinalDec.round(1),avaliacaoInstance4.id])
        
        
        //return [avaliacaoInstance: avaliacaoInstance]        

        
        redirect(action: "edit", id: avaliacaoInstance.id)
        
        
        
    }
    
    
        def finish = {
        def avaliacaoInstance = Avaliacao.get(params.id)
        def avaliacaoInstance1 = Avaliacao.get(params.id)
        def avaliacaoInstance2 = Avaliacao.get(params.id)
        def avaliacaoInstance3 = Avaliacao.get(params.id)
        def avaliacaoInstance4 = Avaliacao.get(params.id)
        
        boolean coordenador = (session.usuario == avaliacaoInstance.curso.coordenador.id)
        
        int isCoordenador = (coordenador)? 1 : 0
        
        long bla = 334
        long d2 = 397
        long d3 = 407
        long d4 = 458
        
        def countDimensao1 = Indicador.executeQuery("select count(*) from Indicador i where i.dimensao.id=?",bla)
        def countDimensao2 = Indicador.executeQuery("select count(*) from Indicador i where i.dimensao.id=?",[d2])
        def countDimensao3 = Indicador.executeQuery("select count(*) from Indicador i where i.dimensao.id=?",[d3])
        def countDimensao4 = Indicador.executeQuery("select count(*) from Indicador i where i.dimensao.id=?",[d4])
        
        int count1 = countDimensao1.get(0);
        int count2 = countDimensao2.get(0);
        int count3 = countDimensao3.get(0);
        int count4 = countDimensao4.get(0);
      
        def dimensao1 = 1
        def dimensao2 = 2
        def dimensao3 = 3
        def dimensao4 = 4
        
        //DIMENSAO 1
        for(int i=1;i<=count1;i++){
            String goku = String.valueOf(dimensao1) + "." + String.valueOf(i)            
            def resposta = Resposta.executeQuery("select r from Resposta r where r.avaliacao=? and r.dimensao=? and indicador=? and coordenador=?",[avaliacaoInstance1,dimensao1,i,isCoordenador])            
            if(!resposta){
                def respostaInstance = new Resposta()
                respostaInstance.avaliacao = avaliacaoInstance1                 
                respostaInstance.conceito = (params.get(goku)) ? Integer.valueOf(params.get(goku)) : -1
                    //println respostaInstance.conceito
                respostaInstance.dimensao = dimensao1
                respostaInstance.indicador = i
                respostaInstance.justificativaNSA = ""
                respostaInstance.respostaRequisitoNormativo = 0
                respostaInstance.lastUpdated = new Date()
                respostaInstance.coordenador = isCoordenador
                
        
                respostaInstance.save(flush: true)
            }else{
               int conceito = (params.get(goku)) ? Integer.valueOf(params.get(goku)) : -1
                Resposta.executeUpdate("update Resposta r  set r.conceito=?,r.lastUpdated=? where r.avaliacao=? and r.dimensao=? and indicador=? and coordenador=?",[conceito,new Date(),avaliacaoInstance1,dimensao1,i,isCoordenador])
            }
    
    
        }
        
        int pesoDimensao1 = avaliacaoInstance1.pesoDimensao1
        //println pesoDimensao1   
        def sumList = Resposta.executeQuery("select sum(r.conceito) from Resposta r where r.avaliacao=? and r.dimensao=? and r.conceito>? and r.coordenador=?",[avaliacaoInstance1,dimensao1,0,isCoordenador])
        int sum = sumList.get(0) 
        //println sum
        count1 = Resposta.executeQuery("select r from Resposta r where r.avaliacao=? and r.dimensao=? and r.conceito>? and r.coordenador=?",[avaliacaoInstance1,dimensao1,0,isCoordenador]).size()
        
        double mediaDimensao1 = (count1) ? sum.div(count1) : 0
        //println mediaDimensao1
    
        
        Avaliacao.executeUpdate("update Avaliacao a  set a.relatoDimensao1=?,a.lastUpdated=?,a.conceitoDimensao1=? where a.id=?",[params.relatoDimensao1,new Date(),mediaDimensao1.round(1),avaliacaoInstance1.id])
        if (isCoordenador == 1) 
        Avaliacao.executeUpdate("update Avaliacao a  set a.coordenadorRelatoDimensao1=?,a.lastUpdated=?,a.coordenadorConceitoDimensao1=? where a.id=?",[params.relatoDimensao1,new Date(),mediaDimensao1.round(1),avaliacaoInstance1.id])
        
        //DIMENSAO 2
        for(int i=1;i<=count2;i++){
            String goku = String.valueOf(dimensao2) + "." + String.valueOf(i)
            def resposta = Resposta.executeQuery("select r from Resposta r where r.avaliacao=? and r.dimensao=? and indicador=? and coordenador=?",[avaliacaoInstance2,dimensao2,i,isCoordenador])
            if(!resposta){
                def respostaInstance = new Resposta()
                respostaInstance.avaliacao = avaliacaoInstance2
                respostaInstance.conceito = (params.get(goku)) ? Integer.valueOf(params.get(goku)) : -1
                respostaInstance.dimensao = dimensao2
                respostaInstance.indicador = i
                respostaInstance.justificativaNSA = ""
                respostaInstance.respostaRequisitoNormativo = 0
                respostaInstance.lastUpdated = new Date()
                respostaInstance.coordenador = isCoordenador
                
        
                respostaInstance.save(flush: true)
            }else{
                int conceito = (params.get(goku)) ? Integer.valueOf(params.get(goku)) : -1
                Resposta.executeUpdate("update Resposta r  set r.conceito=?,r.lastUpdated=? where r.avaliacao=? and r.dimensao=? and indicador=? and coordenador=?",[conceito,new Date(),avaliacaoInstance2,dimensao2,i,isCoordenador])
            }
    
    
        }
        int pesoDimensao2 = avaliacaoInstance1.pesoDimensao2
        def sumList2 = Resposta.executeQuery("select sum(r.conceito) from Resposta r where r.avaliacao=? and r.dimensao=? and r.conceito>? and r.coordenador=?",[avaliacaoInstance1,dimensao2,0,isCoordenador])
        int sum2 = sumList2.get(0) 
        //println sum
        
        count2 = Resposta.executeQuery("select r from Resposta r where r.avaliacao=? and r.dimensao=? and r.conceito>? and r.coordenador=?",[avaliacaoInstance1,dimensao2,0,isCoordenador]).size()
        
        double mediaDimensao2 = (count2) ? sum2.div(count2) : 0
    
        
        Avaliacao.executeUpdate("update Avaliacao a  set a.relatoDimensao2=?,a.lastUpdated=?,a.conceitoDimensao2=? where a.id=?",[params.relatoDimensao2,new Date(),mediaDimensao2.round(1),avaliacaoInstance2.id])
        if (isCoordenador == 1)
        Avaliacao.executeUpdate("update Avaliacao a  set a.coordenadorRelatoDimensao2=?,a.lastUpdated=?,a.coordenadorConceitoDimensao2=? where a.id=?",[params.relatoDimensao2,new Date(),mediaDimensao2.round(1),avaliacaoInstance2.id])
        
        //DIMENSAO 3
        for(int i=1;i<=count3;i++){
            String goku = String.valueOf(dimensao3) + "." + String.valueOf(i)
            def resposta = Resposta.executeQuery("select r from Resposta r where r.avaliacao=? and r.dimensao=? and indicador=? and coordenador=?",[avaliacaoInstance3,dimensao3,i,isCoordenador])
            if(!resposta){
                def respostaInstance = new Resposta()
                respostaInstance.avaliacao = avaliacaoInstance3
                respostaInstance.conceito = (params.get(goku)) ? Integer.valueOf(params.get(goku)) : -1
                respostaInstance.dimensao = dimensao3
                respostaInstance.indicador = i
                respostaInstance.justificativaNSA = ""
                respostaInstance.respostaRequisitoNormativo = 0
                respostaInstance.lastUpdated = new Date()
                respostaInstance.coordenador = isCoordenador
        
                respostaInstance.save(flush: true)
            }else{
                int conceito = (params.get(goku)) ? Integer.valueOf(params.get(goku)) : -1
                Resposta.executeUpdate("update Resposta r  set r.conceito=?,r.lastUpdated=? where r.avaliacao=? and r.dimensao=? and indicador=? and coordenador=?",[conceito,new Date(),avaliacaoInstance3,dimensao3,i,isCoordenador])
            }
    
    
        }
        
        int pesoDimensao3 = avaliacaoInstance1.pesoDimensao3
        def sumList3 = Resposta.executeQuery("select sum(r.conceito) from Resposta r where r.avaliacao=? and r.dimensao=? and r.conceito>? and r.coordenador=?",[avaliacaoInstance1,dimensao3,0,isCoordenador])
        int sum3 = sumList3.get(0) 
        //println sum
        
        count3 = Resposta.executeQuery("select r from Resposta r where r.avaliacao=? and r.dimensao=? and r.conceito>? and r.coordenador=?",[avaliacaoInstance1,dimensao3,0,isCoordenador]).size()
        
        double mediaDimensao3 = (count3) ? sum3.div(count3) : 0

        
        Avaliacao.executeUpdate("update Avaliacao a  set a.relatoDimensao3=?,a.lastUpdated=?,a.conceitoDimensao3=? where a.id=?",[params.relatoDimensao3,new Date(),mediaDimensao3.round(1),avaliacaoInstance3.id])
        if (isCoordenador == 1)
        Avaliacao.executeUpdate("update Avaliacao a  set a.coordenadorRelatoDimensao3=?,a.lastUpdated=?,a.coordenadorConceitoDimensao3=? where a.id=?",[params.relatoDimensao3,new Date(),mediaDimensao3.round(1),avaliacaoInstance3.id])
        
        //DIMENSAO 4
        for(int i=1;i<=count4;i++){
            String goku = String.valueOf(dimensao4) + "." + String.valueOf(i)
            def resposta = Resposta.executeQuery("select r from Resposta r where r.avaliacao=? and r.dimensao=? and indicador=? and coordenador=?",[avaliacaoInstance4,dimensao4,i,isCoordenador])
            if(!resposta){
                def respostaInstance = new Resposta()
                respostaInstance.avaliacao = avaliacaoInstance4
                respostaInstance.conceito = 0//Integer.valueOf(params.get(goku))
                respostaInstance.dimensao = dimensao4
                respostaInstance.indicador = i
                respostaInstance.justificativaNSA = ""
                respostaInstance.respostaRequisitoNormativo = (params.get(goku)) ? Integer.valueOf(params.get(goku)) : -1
                respostaInstance.lastUpdated = new Date()
                respostaInstance.coordenador = isCoordenador
        
                respostaInstance.save(flush: true)
            }else{
                short conceito = (params.get(goku)) ? Integer.valueOf(params.get(goku)) : -1
                Resposta.executeUpdate("update Resposta r  set r.conceito=?,r.respostaRequisitoNormativo=?,r.lastUpdated=? where r.avaliacao=? and r.dimensao=? and indicador=? and coordenador=?",[0,conceito,new Date(),avaliacaoInstance4,dimensao4,i,isCoordenador])
            }
    
    
        }
        
   
        double mediaDimensoes = (mediaDimensao1*pesoDimensao1)+(mediaDimensao2*pesoDimensao2)+(mediaDimensao3*pesoDimensao3)
       
        long mediaFinal = (mediaDimensoes.div(100)).round()
        double mediaFinalDec = (mediaDimensoes.div(100))
        
        
        Avaliacao.executeUpdate("update Avaliacao a  set a.relatoDimensao4=?,a.lastUpdated=?,a.conceitoFinal=?,a.conceitoFinalDec=? where a.id=?",[params.relatoDimensao4,new Date(),mediaFinal.toInteger(),mediaFinalDec.round(1),avaliacaoInstance4.id])
        if (isCoordenador == 1)
        Avaliacao.executeUpdate("update Avaliacao a  set a.coordenadorRelatoDimensao4=?,a.lastUpdated=?,a.coordenadorConceitoFinal=?,a.coordenadorConceitoFinalDec=? where a.id=?",[params.relatoDimensao4,new Date(),mediaFinal.toInteger(),mediaFinalDec.round(1),avaliacaoInstance4.id])
        
        
        //return [avaliacaoInstance: avaliacaoInstance]        

        
        redirect(action: "show", id: avaliacaoInstance.id)
        
        
        
    }
    
    def show = {
        def avaliacaoInstance = Avaliacao.get(params.id)
        
        boolean coordenador = (session.usuario == avaliacaoInstance.curso.coordenador.id)
        
        int isCoordenador = (coordenador)? 1 : 0                        
        
        def respostas = Resposta.findAll("from Resposta r where r.avaliacao=? and r.coordenador=?",[avaliacaoInstance,isCoordenador])        
        
        if (!respostas){
            flash.message = "Por favor, inicie sua avaliação para visualizar os dados da mesma"
            redirect(action: "list")
        }
        def dimensao1 = Dimensao.executeQuery("select d.titulo from Dimensao d where d.ordem=1")
        def dimensao2 = Dimensao.executeQuery("select d.titulo from Dimensao d where d.ordem=2")
        def dimensao3 = Dimensao.executeQuery("select d.titulo from Dimensao d where d.ordem=3")
        
        
        
        def faltaResposta1 = Resposta.findAll("from Resposta r where r.avaliacao=? and r.coordenador=? and r.conceito=-1 and r.dimensao=1",[avaliacaoInstance,isCoordenador])        
        def faltaResposta2 = Resposta.findAll("from Resposta r where r.avaliacao=? and r.coordenador=? and r.conceito=-1 and r.dimensao=2",[avaliacaoInstance,isCoordenador])
        def faltaResposta3 = Resposta.findAll("from Resposta r where r.avaliacao=? and r.coordenador=? and r.conceito=-1 and r.dimensao=3",[avaliacaoInstance,isCoordenador])        
        def faltaResposta4 = Resposta.findAll("from Resposta r where r.avaliacao=? and r.coordenador=? and r.respostaRequisitoNormativo=-1 and r.dimensao=4",[avaliacaoInstance,isCoordenador])
        
        if (!avaliacaoInstance) {
            flash.message = "${message(code: 'default.not.found.message', args: [message(code: 'avaliacao.label', default: 'Avaliacao'), params.id])}"
            redirect(action: "list")
        }
        else {
            [avaliacaoInstance: avaliacaoInstance, dimensao1: dimensao1,dimensao2: dimensao2,dimensao3: dimensao3,faltaResposta1: faltaResposta1.size(),faltaResposta2: faltaResposta2.size(),faltaResposta3: faltaResposta3.size(),,faltaResposta4: faltaResposta4.size()]
        }
    }
    
    def finishAvaliacao = {
        def avaliacaoInstance = Avaliacao.get(params.id)
        
        if (avaliacaoInstance.status.equals("Coordenador"))
            Avaliacao.executeUpdate("update Avaliacao a  set a.status=?,a.relatoDimensao1='',a.relatoDimensao2='',a.relatoDimensao3='',a.relatoDimensao4='',a.conceitoDimensao1=0,a.conceitoDimensao2=0,a.conceitoDimensao3=0,a.conceitoFinal=0,a.conceitoFinalDec=0 where a.id=?",["Em andamento",avaliacaoInstance.id])
        else
            Avaliacao.executeUpdate("update Avaliacao a  set a.status=? where a.id=?",["Finalizada",avaliacaoInstance.id])
        
        
        redirect(action: "list")
        
    }
    def pdfReport = {
        
        def avaliacaoInstance = Avaliacao.get(params.id)
        
        boolean coordenador = (session.usuario == avaliacaoInstance.curso.coordenador.id)
        
        int isCoordenador = (coordenador)? 1 : 0
        
        def indicadoresDimensao1 = Indicador.executeQuery(" select i from Indicador i where i.dimensao.ordem = ? order by i.ordem", [1]) 
        def indicadoresDimensao2 = Indicador.executeQuery(" select i from Indicador i where i.dimensao.ordem = ? order by i.ordem", [2]) 
        def indicadoresDimensao3 = Indicador.executeQuery(" select i from Indicador i where i.dimensao.ordem = ? order by i.ordem", [3]) 
        def indicadoresDimensao4 = Indicador.executeQuery(" select i from Indicador i where i.dimensao.ordem = ? order by i.ordem", [4]) 
        
        
        def respostaInstance = Resposta.executeQuery("select r from Resposta r where r.avaliacao=? and r.coordenador=? order by r.dimensao,r.indicador",[avaliacaoInstance,isCoordenador])                
        

        return [indicadoresDimensao1: indicadoresDimensao1,indicadoresDimensao2: indicadoresDimensao2,indicadoresDimensao3: indicadoresDimensao3,indicadoresDimensao4: indicadoresDimensao4, avaliacaoInstance: avaliacaoInstance, respostaInstance: respostaInstance]
    }    
}